<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
			//数组的解构赋值
			let [a, b, c] = [1, 2, 3];
			 a //1
			 b //2;
			 c //3;
			 
			//如果解构不成功，变量的值就等于undefined。
			//以下两种情况都属于解构不成功，
			//foo的值都会等于undefined。
			let [foo] = [];
			let [bar, foo] = [1];
			
			//另一种情况是不完全解构，即等号左边的模式，
			//只匹配一部分的等号右边的数组。这种情况下，解构依然可以成功。
			let [x, y] = [1, 2, 3];
			x // 1
			y // 2
			
			//等号的右边不是数组（或者严格地说，不是可遍历的结
			//构，参见《Iterator》一章），那么将会报错。
			// 报错
			let [foo] = 1;
			let [foo] = false;
			let [foo] = NaN;
			let [foo] = undefined;
			let [foo] = null;
			let [foo] = {};
			
			//对于 Set 结构，也可以使用数组的解构赋值。
			let [x, y, z] = new Set(['a', 'b', 'c']);
			x // "a"
			
			//解构赋值允许指定默认值。
			let [foo = true] = [];
			foo // true
			//ES6 内部使用严格相等运算符（===），判断一个位置是否有值。所以，
			//只有当一个数组成员严格等于undefined，默认值才会生效。
			//如果一个数组成员是null，默认值就不会生效，因为null不严格等于undefined
			let [x, y = 'b'] = ['a']; // x='a', y='b'
			let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
			let [n = 1] = [null];
			n // null
			
			//默认值可以引用解构赋值的其他变量，但该变量必须已经声明。
			//这里报错是因为x用y做默认值时，y还没有声明
			let [x = y, y = 1] = [];     // ReferenceError: y is not defined
		</script>
	</body>
</html>
